package view;

import javax.swing.JFrame;

import model.Consulta;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYIntervalSeries;
import org.jfree.data.xy.XYIntervalSeriesCollection;
import org.jfree.ui.ApplicationFrame;

public class Grafico extends ApplicationFrame
{

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("deprecation")
	public Grafico(Consulta c)
	{

		super("Curva Precisão x Revocação");

		final XYIntervalSeries iseries = new XYIntervalSeries("Curva P R");

		String[] resposta = c.getRespostas();
		String[] docs = c.getRelevantes();

		int relevantesEncontrados = 0, calcTemp;

		// calculos locais no laço
		double precisao, revocacao;

		/*
		 * controle dos valores de precisao em cada intervalo o array representa
		 * (cada posicao): 0-10 10-20 20-30 ...
		 */
		double[] intervalos = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

		for (int x = 0; x < resposta.length; x++)
		{

			for (int y = 0; y < docs.length; y++)
			{

				if (resposta[x].equals(docs[y]))
				{ // intersecao encontrada
					relevantesEncontrados++;

					precisao = 100 * ((double) relevantesEncontrados / (double) (x + 1));
					revocacao = 100 * ((double) relevantesEncontrados / (double) docs.length);

					calcTemp = (int) revocacao / 10;

					if ((revocacao % 10) == 0 && calcTemp != 10)
					{ // valor de revocação é padrão
						if (intervalos[calcTemp] < precisao)
							intervalos[calcTemp] = precisao;
					}

					// atualizando array de intervalos
					if (intervalos[calcTemp - 1] < precisao)
						intervalos[calcTemp - 1] = precisao;
				}

			}

		}

		// PRECISOES E REVOCACOES CALCULADOS.. INTERPOLACAO AGORA.

		for (int g = 0; g < intervalos.length; g++)
		{

			if (intervalos[g] > 0)
			{ // ha um valor de precisao calculado. Vou aplicar pra todos os
				// intervalos anteriores que nao possuem valor calculado
				for (int f = 0; f < g; f++)
				{
					if (intervalos[f] == 0)
						intervalos[f] = intervalos[g]; // aplicando pra todos
														// os anteriores
				}
			}

		}

		// ponto zero
		iseries.add(0,0,10,intervalos[0],0,10);

		for (int g = 0; g < intervalos.length; g++)
		{
			iseries.add((g + 1) * 10,g * 10,(g * 10) + 10,intervalos[g],g * 10,(g * 10) + 10);
		}

		// PLOTAR GRAFICO

		final XYIntervalSeriesCollection dataX = new XYIntervalSeriesCollection();
		dataX.addSeries(iseries);

		final JFreeChart grafico = ChartFactory.createXYLineChart("Consulta: " + c.getNome() + "","Revocação (%)","Precisão (%)",dataX,PlotOrientation.VERTICAL,true,true,false);

		XYPlot plot = grafico.getXYPlot();
		XYLineAndShapeRenderer r = new XYLineAndShapeRenderer();
		plot.setRenderer(r);

		final ChartPanel painel = new ChartPanel(grafico);
		painel.setPreferredSize(new java.awt.Dimension(600,370));

		setContentPane(painel);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

}
